import {
	devUrl,
	testUrl,
	prodUrl,
	contentType,
	showLoading,
	loadingText,
	loadingTime,
	headerTokenName,
	userTokenName,
	codeName,
	successCode,
	invalidCode,
} from '@/common/settings'


/**
 * @description 处理code异常
 * @param {Number} code 错误码
 * @param {String} msg 错误信息
 */
const handleCode = (code,msg) => {
  switch (code) {
    case 401:
      uni.showModal({
      	title: '提示',
				content: '登录过期，请重试'
      })
      break
		case 403:
		  uni.showModal({
		  	title: '提示',
				content: '登录过期，请重试'
		  })
		  break
    default:
			uni.showModal({
				title: '提示',
				content: msg || '请求出错，请重试'
			})
      break
  }
}

// 获取baseUrl
const getBaseUrl = envVersion => {
	const URLMAP = {
		release: prodUrl,
		trial: testUrl,
		develop: devUrl,
	}
	return URLMAP[envVersion]
}

const install = (Vue, vm) => {
	Vue.prototype.$u.http.setConfig({
		baseUrl: '',
		// baseUrl: getBaseUrl(__wxConfig.envVersion),
		method: 'GET',
		dataType: 'json',
		showLoading,
		loadingText,
		loadingTime,
		originalData: false, // 是否在拦截器中返回服务端的原始数据
		loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
		// 配置请求头信息
		header: {
			'content-type': contentType
		},
	});

	// 请求拦截
	Vue.prototype.$u.http.interceptor.request = (config) => {
		config.header[headerTokenName] = vm.userInfo?. [userTokenName] || '';
		// 可以对某个url进行特别处理，此url参数为this.$u.get(url)中的url值
		// if(config.url == '/user/login') config.header.noToken = true;
		return config;
		// 如果return一个false值，则会取消本次请求
		// if(config.url == '/user/rest') return false; // 取消某次请求
	}

	// 响应拦截
	Vue.prototype.$u.http.interceptor.response = (res) => {
		console.log(res)
		if (res[codeName] == successCode) {
			return res
		} else if (res[codeName] == invalidCode) {
			// token失效，这里跳转登录
			vm.$u.showToast({
				title: '验证失败，请重新登录',
				success: () => {
					vm.$u.route('/pages/user/login/login')
				}
			})
			return false
		} else {
			handleCode(res[codeName], res.msg)
			return false;
		}
	}
}

export default {
	install
}
